import { defineStore } from 'pinia';

// 定义文件类型
export interface FileItem {
  id: string;
  label: string;
  type: string;
  catalogId: string;
}

// 定义存储
export const useFileStore = defineStore('fileStore', {
  // 定义状态
  state: () => ({
    files: [] as FileItem[][], // 二维数组
  }),

  // 定义操作
  actions: {
    // 添加单个或多个文件
    addFile(file: File | File[] | FileItem | FileItem[]) {
      // 处理单个文件
      const addSingleFile = (f: File | FileItem) => {
        const exists = this.files.some((group) =>
          group.some((existingFile) => existingFile.id === (f as FileItem).id),
        );
        if (!exists) {
          const fileItem = f as FileItem;
          // 默认创建一个新组并重新赋值
          this.files = [...this.files, [fileItem]]; // 创建新数组引用
        }
      };

      // 判断传入的是单个文件还是文件数组
      if (Array.isArray(file)) {
        file.forEach((f) => addSingleFile(f));
      } else {
        addSingleFile(file);
      }
    },

    // 删除文件
    removeFile(fileId: string) {
      // 使用 map 和 filter 创建新数组并赋值
      this.files = this.files
        .map((group) => group.filter((file) => file.id !== fileId))
        .filter((group) => group.length > 0);
    },
    // 根据 label 删除文件
    removeFileByLabel(label: string) {
      // 使用 map 和 filter 创建新数组并赋值
      this.files = this.files
        .map((group) => group.filter((file) => file.label !== label)) // 过滤掉匹配 label 的文件
        .filter((group) => group.length > 0); // 过滤掉空的组
    },
    // 清空文件列表
    clearFiles() {
      this.files = []; // 重新赋值为空数组
    },

    // 添加一个文件组
    addFileGroup(files: FileItem[]) {
      // 将整个新文件组重新赋值给 files 数组
      this.files = [...this.files, files];
    },
  },

  // 定义 getters
  getters: {
    // 获取文件数量
    fileCount: (state) =>
      state.files.reduce((total, group) => total + group.length, 0),

    // 根据类型获取文件
    getFilesByType: (state) => {
      return (type: string) => {
        return state.files.flat().filter((file) => file.type === type);
      };
    },

    // 获取所有文件
    allFiles: (state) => state.files.flat(), // 展平数组以获取所有文件

    // 判断 allFiles 是否为空
    isAllFilesEmpty: (state) => state.files.flat().length === 0,
  },
});
